package com.jsy.common.util.face;

import cn.smartjavaai.common.entity.DetectionResponse;
import cn.smartjavaai.face.config.FaceModelConfig;
import cn.smartjavaai.face.entity.FaceResult;
import cn.smartjavaai.face.enums.FaceModelEnum;
import cn.smartjavaai.face.factory.FaceModelFactory;
import cn.smartjavaai.face.model.facerec.FaceModel;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;

/**
 * 字段名称	类型	默认值	说明
 *modelEnum	FaceModelEnum	RETINA_FACE	人脸模型
 * confidenceThreshold	double	0.85	置信度阈值
 * similarityThreshold	double	0.62	相似度阈值
 * nmsThresh	double	0.45	非极大抑制阈值
 * modelPath	String	null	模型路径
 * faceDbPath	String	null	人脸库路径
 * device	DeviceEnum	CPU	运行设备
 *
 * 模型名称	下载地址	兼容系统	支持设备	文件大小	适用场景
 * retinaface	下载	Windows/Linux/MacOS	CPU/GPU	110MB	高精度人脸检测
 * ultralightfastgenericface	下载	Windows/Linux/MacOS	CPU/GPU	1.7MB	高速人脸检测
 * seetaface6	下载	Windows/Linux	CPU/GPU	288MB	人脸检测、人脸比对、人脸库注册、查询
 * facenet	下载	Windows/Linux/MacOS	CPU/GPU	104MB	人脸特征提取、人脸比对
 *
 * 人脸信息：5个人脸关键点：循序依次为，左眼中心、右眼中心、鼻尖、左嘴角和右嘴角
 */
public class FaceRecognition{
    public static void main(String[] args) {
        faceRecognition();
    }

    private static void faceRecognition() {
        //获取人脸模型
        FaceModel faceModel = FaceModelFactory.getInstance().getModel();
        //1创建人脸模型配置
//        FaceModelConfig config = new FaceModelConfig();
//        config.setModelEnum(FaceModelEnum.RETINA_FACE);
//        config.setConfidenceThreshold(FaceConfig.DEFAULT_CONFIDENCE_THRESHOLD);
//        config.setNmsThresh(FaceConfig.NMS_THRESHOLD);
//        FaceModel faceModel = FaceModelFactory.getInstance().getModel(config);
        //当然你也可以传 BufferedImage 或 byte[]。一张图里多张脸也完全没问题
        // 2人脸检测方法
//        DetectionResponse response = faceModel.detect("test.jpg");
        String path = "C:\\Users\\gates\\Pictures\\Saved Pictures\\孟庭苇2.jpg";
        FileInputStream fileInputStream = null;
        try {
             fileInputStream = new FileInputStream(path);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        DetectionResponse response = faceModel.detect(fileInputStream);
        System.out.println(response);
        //检测并绘制人脸
//        faceModel.detectAndDraw("input.jpg","output.jpg");
        // 6、人脸特征提取
//        List<float[]> faceResult = faceModel.extractFeatures("input.jpg");
        //7、人脸特征比对
//        float similar = faceModel.calculSimilar(feature1, feature2);
        //8、人脸比对（1:1）
//        float similar = faceModel.featureComparison("input1.jpg","input2.jpg");
//        9、人脸注册
//        boolean isSuccss = faceModel.register("zhangsan","input.jpg");
        //10、人脸比对（1：N）
//        FaceResult faceResult = faceModel.search("input.jpg");
    }
}
